package monopoli.game;

import java.util.ArrayList; 
import java.util.Iterator;
import java.util.Collections;
import monopoli.Monopoli;

public class Banca {

    private ArrayList<Banconota> banconoteList;

    private ArrayList<Costruzione> costruzioniList;

    private ArrayList<Proprieta> proprietaList;

    public Banca () {
    }

    public ArrayList<Banconota> getBanconoteLista () {
        return banconoteList;
    }

    public void setBanconoteLista (ArrayList<Banconota> val) {
        this.banconoteList = val;
    }
    
    public Banconota getBanconota(int index) {
        return banconoteList.get(index);
    }
    
    public void addBanconota(Banconota b) {
        banconoteList.add(b);
    }
    
    

    public ArrayList<Costruzione> getCostruzioneList () {
        return costruzioniList;
    }

    public void setCostruzioneList (ArrayList<Costruzione> val) {
        this.costruzioniList = val;
    }
    
    public Costruzione getCostruzione(int index) {
        return costruzioniList.get(index);
    }
    
    public void addCostruzione(Costruzione c) {
        costruzioniList.add(c);
    }

    public ArrayList<Proprieta> getProprietaList () {
        return proprietaList;
    }
    
    public void setProprietaList (ArrayList<Proprieta> val) {
        this.proprietaList = val;
    }

    
    public Proprieta getProprieta(int index) {
        return proprietaList.get(index);
    }
    
    public void addProprieta(Proprieta p) {
        proprietaList.add(p);
    }
    
    public void inizializza() {
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Inizializzazione della Banca");
        banconoteList = creaSoldi();
        Iterator it = banconoteList.iterator();
        while(it.hasNext()) {
            ((Banconota)it.next()).setAmount(100);
        }
        stampaSoldi(banconoteList);
    }

    public void incassa (ArrayList<Banconota> bList) {
        banconoteList = sommaDenaro(bList,banconoteList);
    }

    public void paga (int value) {
        ArrayList<Banconota> blist = ottieniSoldi(banconoteList,value);
    }

    
    
    //PREVEDERE IN QUESTA ROUTINE LA POSSIBILITA' DI EFFETTUARE SCAMBI CON LA BANCA IN CASO DI
    //MANCANZA DI BANCONOTE DI TAGLIO PICCOLO
    public ArrayList<Banconota> ottieniSoldi(ArrayList<Banconota> bl, int value) {

        ArrayList<Banconota> resList = this.creaSoldi();
        //Ordino la lista in modo decrescente
        Collections.sort(bl);
        Collections.reverse(bl);
        Iterator it = bl.iterator();
        int tmpValue=value;
        int bVal = 0;
        int bCount = 0;

        if(contaSoldi(bl) >= value) {

        while(it.hasNext() && tmpValue > 0) {
            Banconota b = (Banconota)it.next();
            bVal = b.getValue();
           
                    
            while(bVal <= tmpValue && b.getAmount() > 0) {
                tmpValue -= bVal;
                this.spostaBanconote(1, bVal, bl, resList);
            }
        }

        //mancano dei soldi da pagare...
        if(tmpValue > 0) {
            Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Somma non pagata...Prevedere scambio con la banca?");
            this.cambia(bl);

            //effettuo scambio con la banca
            //ottieniBanconote(bl, tmpValue)
            
            //altrimenti 
            //Caso somma non pagabile!
            return sommaDenaro(resList, ottieniSoldi(bl,tmpValue));
            }
        }
        return resList;
    }

    public ArrayList<Banconota> sommaDenaro(ArrayList<Banconota> l1, ArrayList<Banconota> l2) {
        Iterator it1 = l1.iterator();
        Iterator it2;
        while(it1.hasNext()) {
            Banconota b1 = (Banconota)it1.next();
            it2 = l2.iterator();
            while(it2.hasNext()) {
                Banconota b2 = (Banconota)it2.next();
                if(b2.getValue()==b1.getValue()) {
                    b2.setAmount(b2.getAmount() + b1.getAmount());
                }
            }
        }
        return l2;
    }
    
    
    //Stampa il conenuto di una lista di soldi
    public void stampaSoldi(ArrayList<Banconota> l) {
        Iterator it = l.iterator();
       Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Stampa Soldi:");
        while(it.hasNext()) {
            Banconota b = (Banconota)it.next();
            
            Monopoli.getMonopoliGUI().debugMessage("[DBG_game]" +  b.getAmount() + " banconote da " + b.getValue() + " EURO");
        }
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Fine Stampa Soldi");
    }
    
    //Crea una lista di soldi completa
    public ArrayList<Banconota> creaSoldi() {
        ArrayList<Banconota> list = new ArrayList<Banconota>();
        
        Banconota bCento = new Banconota();
        bCento.setName("Cento");
        bCento.setAmount(0);
        bCento.setValue(100);
        
        Banconota bMille = new Banconota();
        bMille.setName("Mille");
        bMille.setAmount(0);
        bMille.setValue(1000);
        
        Banconota bCinquemila = new Banconota();
        bCinquemila.setName("Cinquemila");
        bCinquemila.setAmount(0);
        bCinquemila.setValue(5000);
        
        Banconota bDiecimila = new Banconota();
        bDiecimila.setName("Diecimila");
        bDiecimila.setAmount(0);
        bDiecimila.setValue(10000);
        
        Banconota bCinquantamila = new Banconota();
        bCinquantamila.setName("Cinquantamila");
        bCinquantamila.setAmount(0);
        bCinquantamila.setValue(50000);
        
        list.add(bCento);
        list.add(bMille);
        list.add(bCinquemila);
        list.add(bDiecimila);
        list.add(bCinquantamila);

        Collections.sort(list);
        Collections.reverse(list);
        
        return list;
                
    }
    
    
    //Spostare soldi da una lista a un'altra
    public boolean spostaBanconote(int amount,int value,ArrayList<Banconota> fromList,ArrayList<Banconota> toList) {
        Iterator it = fromList.iterator();
        Banconota b = new Banconota();
        Banconota btmp;
        //Tolgo i soldi dalla lista di partenza
        while(it.hasNext()) {
            btmp = (Banconota) it.next();
            if(btmp.getValue() == value) {
                b = new Banconota();
                btmp.setAmount(btmp.getAmount() - amount);
                b.setAmount(amount);
                b.setValue(value);
            }
        }
        it = toList.iterator();
        while(it.hasNext() && (b.getValue() != 0)) {
            btmp = (Banconota)it.next();
            if(btmp.getValue() == b.getValue()) {
                btmp.setAmount(btmp.getAmount() + b.getAmount());
            }
        }
        
        if(b.getValue() == 0) {
            return false;
        } 
        else {
            return true;
        }
    }

     public int contaSoldi(ArrayList<Banconota> b) {
         int amount=0;
         Iterator it =b.iterator();
         while(it.hasNext()) {
             Banconota bb = (Banconota)it.next();
             amount += bb.getAmount() * bb.getValue();
         }
         return amount;
     }


     public void cambia(ArrayList<Banconota> l) {
         Collections.sort(l);
         Collections.reverse(l);
         Iterator it = l.iterator();

         while(it.hasNext()) {
             Banconota b = (Banconota)it.next();
             int value = b.getValue();
             if(value != 50000) {
                 if(b.getAmount() == 0) {
                     if(value==10000) {
                            Banconota b1 = l.get(0);
                            if(b1.getAmount() > 0) {
                                b.setAmount(5);
                                b1.setAmount(b1.getAmount() - 1);
                            }
                     }
                     if(value==5000) {
                            Banconota b1 = l.get(1);
                            if(b1.getAmount() > 0) {
                                b.setAmount(2);
                                b1.setAmount(b1.getAmount() - 1);
                            }
                     }
                     if(value==1000) {
                            Banconota b1 = l.get(2);
                            if(b1.getAmount() > 0) {
                                b.setAmount(5);
                                b1.setAmount(b1.getAmount() - 1);
                            }
                     }
                     if(value==100) {
                            Banconota b1 = l.get(3);
                            if(b1.getAmount() > 0) {
                                b.setAmount(10);
                                b1.setAmount(b1.getAmount() - 1);
                            }
                     }

                 }
             }
         }

     Monopoli.getMonopoliGUI().appendInfoPlayer("EFFETTUATO CAMBIO SOLDI PER PAGAMENTO");

    }

     
}
